#ifndef DOWNLOADITEM_H
#define DOWNLOADITEM_H

#include <QtCore/QObject>
#include <QtCore/QString>
#include <QtCore/QDateTime>
#include <QtCore/QVector>
#include <QtCore/QTimer>
#include <QtCore/QStringList>
#include <QtNetwork/QNetworkReply>

class QNetworkReply;
class QNetworkAccessManager;
class QFile;

class DownloadItem : public QObject
{
    Q_OBJECT

public:
    enum Status {
        Queued,
        Downloading,
        Paused,
        Completed,
        Error,
        Canceled
    };
    Q_ENUM(Status)

    explicit DownloadItem(const QString &url, QObject *parent = nullptr);
    ~DownloadItem();

    QString url() const;
    QString fileName() const;
    qint64 fileSize() const;
    qint64 downloadedSize() const;
    Status status() const;
    int progress() const;
    QDateTime startTime() const;
    QDateTime endTime() const;
    QString savePath() const;
    int downloadSpeed() const; // 返回当前下载速度 (bytes/sec)
    QString category() const;   // 获取分类
    QStringList tags() const;   // 获取标签
    
    // 重试相关方法
    int retryCount() const;     // 获取当前重试次数
    int maxRetries() const;     // 获取最大重试次数
    void setMaxRetries(int maxRetries); // 设置最大重试次数

    void setSavePath(const QString &path);
    void setMaxConnections(int max); // 设置最大连接数
    void setSpeedLimit(int limitKBps); // 设置速度限制 (KB/s)
    void setCategory(const QString &category); // 设置分类
    void setTags(const QStringList &tags);     // 设置标签

public slots:
    void start();
    void pause();
    void cancel();

signals:
    void statusChanged(DownloadItem::Status status);
    void progressChanged(int progress);
    void downloadFinished();
    void downloadError(const QString &errorString);
    void downloadSpeedChanged(int speed); // 下载速度变化信号

private slots:
    void onReadyRead();
    void onFinished();
    void onError(QNetworkReply::NetworkError error);
    void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
    
    // 多线程下载相关槽函数
    void onSegmentReadyRead();
    void onSegmentFinished();
    void onSegmentError(QNetworkReply::NetworkError error);
    void onSegmentProgress(qint64 bytesReceived, qint64 bytesTotal);
    
    // 重试相关槽函数
    void onRetryTimeout(); // 重试定时器超时

private:
    void updateFileName();
    void startMultiThreadDownload(); // 开始多线程下载
    void stopMultiThreadDownload();  // 停止多线程下载
    qint64 calculateSpeed();         // 计算下载速度
    void scheduleRetry();            // 安排重试

    QString m_url;
    QString m_fileName;
    QString m_savePath;
    qint64 m_fileSize;
    qint64 m_downloadedSize;
    Status m_status;
    int m_progress;
    QDateTime m_startTime;
    QDateTime m_endTime;
    
    // 分类和标签
    QString m_category;
    QStringList m_tags;
    
    // 重试机制
    int m_retryCount;      // 当前重试次数
    int m_maxRetries;      // 最大重试次数
    QTimer *m_retryTimer;  // 重试定时器
    
    // 下载设置
    int m_maxConnections;  // 最大连接数
    int m_speedLimit;      // 速度限制 KB/s
    
    // 多线程下载相关
    QVector<QNetworkReply*> m_replies;  // 网络请求列表
    QVector<qint64> m_segmentSizes;     // 各段大小
    QVector<qint64> m_segmentDownloaded; // 各段已下载大小
    QTimer *m_speedTimer;           // 速度计算定时器
    qint64 m_lastDownloadedSize;    // 上次计算速度时的下载大小
    int m_downloadSpeed;            // 当前下载速度 (bytes/sec)
    
    QNetworkReply *m_reply;         // 单线程下载使用的reply
    QFile *m_file;                  // 下载文件句柄
};

#endif // DOWNLOADITEM_H